package main

import (
	"fmt"
	"html/template"
	"net/http"
)

type User struct {
	Name string
	Age  int
}

func main() {
	//请求处理  函数处理请求   浏览器访问"/hello" 就会去处理hello方法的业务逻辑
	http.HandleFunc("/hello", hello)
	http.HandleFunc("/login", login) //登录请求
	http.HandleFunc("/register", register)
	//响应页面  就是将数据显示在页面上
	http.HandleFunc("/temp", temp)
	http.HandleFunc("/temp2", temp2)

	//  端口   addr :为你的本机端口  handler ：为你得处理器  nil就是使用默认处理器
	//浏览器输入localhost:8080 出现404是因为没有页面响应
	http.ListenAndServe("localhost:8080", nil) //开一个端口
}

func temp2(writer http.ResponseWriter, request *http.Request) {
	//解析指定文件（建立连接） 返回一个对象
	temp, _ := template.ParseFiles("./goHttp/client4.html")

	userMap := make(map[int]User) //创建map准备放入数据
	userMap[0] = User{"小王", 2}
	userMap[1] = User{"小王", 3}
	userMap[2] = User{"小王", 4}
	userMap[3] = User{"小王", 6}
	data := make(map[string](map[int]User)) // 定义一个map的map
	data["data"] = userMap                  //将userMap放入data中
	temp.Execute(writer, data)              //用writer将数据给到页面

}

func temp(writer http.ResponseWriter, request *http.Request) {
	//解析指定文件（建立连接） 返回一个对象
	temp, _ := template.ParseFiles("./goHttp/client4.html")
	data := make(map[string]string) //定义一个map用于传数据
	data["Info"] = "hello,小王"       //设置数据
	temp.Execute(writer, data)      //用writer将数据给到页面
}

func register(writer http.ResponseWriter, request *http.Request) {
	request.ParseForm()                          //解析表单 就可以获取表单的数据
	fmt.Println(request.PostForm)                //获取表单中的值
	username := request.PostForm.Get("username") //Get里的username 对应的是html中input里面的name
	password := request.PostForm.Get("password")
	fmt.Println("username:", username, "password:", password)
	//业务逻辑 （判定用户名或者密码正确与否）

	//响应信息给客户端
	writer.Write([]byte(`{"status" : "ok"}`))

}

func login(writer http.ResponseWriter, request *http.Request) {
	//获取用户传过来的数据
	data := request.URL.Query() //查询客户端传过来的数据
	username := data.Get("username")
	password := data.Get("password")
	fmt.Println("username：", username, "password：", password)

	//响应信息给客户端  (就比如给用户的一些提示)
	if username == "admin" {
		writer.Write([]byte("登录成功"))
	} else {
		writer.Write([]byte("登录失败"))
	}
}

// ResponseWriter：为响应出去的  Request ：为接 收回来的
func hello(writer http.ResponseWriter, request *http.Request) {
	//request  就是浏览器访问之后，可以获得用户请求的信息  （就收信息）
	fmt.Println(request.Method) //GET
	fmt.Println(request.Header)
	fmt.Println(request.URL) // 输出请求头/hello
	//得到远程地址（用户请求时候的地址 ）
	fmt.Println(request.RemoteAddr) //127.0.0.1:50644
	//得到响应体  例如：登录  得到用户的用户名和密码
	fmt.Println(request.Body) //  此时没有返回的内容{}
	fmt.Println("程序访问到了")     //get方式  在控制台输出

	//writer  就是在浏览器访问之后  写出相应的内容给客户看  （展示信息）
	//也可以在[]byte内写入前端一些标识  例如 <h1> </h1>
	writer.Write([]byte("<h1>Go真的好简洁啊   哈哈哈</h1>")) // 定义一个切片写出所展示的信息
}
